#ifndef BASKET_H
#define BASKET_H

#include <memory>
#include <vector>
#include <set>
#include "quote.h"

class Basket
{
public:
    // Basket 使用合成的默认构造函数和拷贝控制成员
    void add_item(const std::shared_ptr<Quote> &sale) { items.insert(sale); }
    void add_item(const Quote &sale)   // 拷贝给定对象
        { items.insert(std::shared_ptr<Quote>(sale.clone())); }
    void add_item(Quote &&sale)    // 移动给定对象
        { items.insert(std::shared_ptr<Quote>(std::move(sale).clone())); }
    // 打印每本书的总价和购物篮中所有书的总价
    double total_receipt(std::ostream&) const;
private:
    // 该函数用于比较 shared_ptr,multiset 成员会用到它
    static bool compare(const std::shared_ptr<Quote> &lhs,
                        const std::shared_ptr<Quote> &rhs)
    { return lhs->isbn() < rhs->isbn(); }
    // multiset 保存多个报价,按照 compare 成员排序
    std::multiset<std::shared_ptr<Quote>, decltype(compare)*> items{compare};
};

#endif // BASKET_H
